1 package edu.jiangxin.apktoolbox.pdf; 2 3 import org.apache.pdfbox.io.RandomAccessReadBuffer; 4 import org.apache.pdfbox.pdfparser.PDFParser; 5 import org.apache.pdfbox.pdmodel.PDDocument; 6 import org.apache.pdfbox.pdmodel.interactive.action.PDAction; 7 import org.apache.pdfbox.pdmodel.interactive.action.PDActionGoTo; 8 import org.apache.pdfbox.pdmodel.interactive.documentnavigation.destination.PDDestination; 9 import org.apache.pdfbox.pdmodel.interactive.documentnavigation.destination.PDPageDestination; 10 import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDDocumentOutline; 11 import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlineItem; 12 import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlineNode; 13 import org.junit.jupiter.api.Test; 14 15 import java.io.File; 16 import java.io.FileInputStream; 17 import java.io.IOException; 18 19 public class PdfOutlineTest { 20 String path = "target/test-classes/pdf/"; 21 22 public void alterOutline(PDOutlineNode pdOutlineNode, String indentation) throws IOException { 23 24 PDOutlineItem currentPdOutlineItem = pdOutlineNode.getFirstChild(); 25 while (currentPdOutlineItem != null) { 26 if (currentPdOutlineItem.getDestination() instanceof PDPageDestination) { 27 PDPageDestination pdOutlineItemDestination = (PDPageDestination) currentPdOutlineItem.getDestination(); 28 pdOutlineItemDestination.setPageNumber(pdOutlineItemDestination.retrievePageNumber() + 25); 29 } 30 if (currentPdOutlineItem.getAction() instanceof PDActionGoTo) { 31 PDActionGoTo pdActionGoTo = (PDActionGoTo) currentPdOutlineItem.getAction(); 32 if (pdActionGoTo.getDestination() instanceof PDPageDestination) { 33 PDPageDestination pd = (PDPageDestination) pdActionGoTo.getDestination(); 34 pd.setPageNumber(pd.retrievePageNumber() + 25); 35 } 36 } 37 alterOutline(currentPdOutlineItem, indentation + " "); 38 currentPdOutlineItem = currentPdOutlineItem.getNextSibling(); 39 } 40 } 41 42 public void printOutline(PDOutlineNode pdOutlineNode, String indentation) throws IOException { 43 PDOutlineItem currentPdOutlineItem = pdOutlineNode.getFirstChild(); 44 while (currentPdOutlineItem != null) { 45 int pages = 0; 46 StringBuilder extraInfo = new StringBuilder(); 47 PDDestination pdDestination = currentPdOutlineItem.getDestination(); 48 extraInfo.append(indentation + currentPdOutlineItem.getTitle()); 49 if (pdDestination instanceof PDPageDestination) { 50 PDPageDestination pdOutlineItemDestination = (PDPageDestination) pdDestination; 51 pages = (pdOutlineItemDestination.retrievePageNumber() + 1); 52 extraInfo.append(":").append(pdDestination.getClass().getSimpleName()).append(":").append(pages); 53 } else { 54 PDAction pdAction = currentPdOutlineItem.getAction(); 55 if (pdAction instanceof PDActionGoTo) { 56 PDActionGoTo pdActionGoTo = (PDActionGoTo) pdAction; 57 pdDestination = pdActionGoTo.getDestination(); 58 if (pdDestination instanceof PDPageDestination) { 59 PDPageDestination pd = (PDPageDestination) pdDestination; 60 pages = (pd.retrievePageNumber() + 1); 61 extraInfo.append(":PDActionGoTo:").append(pdDestination.getClass().getSimpleName()).append(":").append(pages); 62 } 63 } 64 } 65 66 System.out.println(extraInfo); 67 printOutline(currentPdOutlineItem, indentation + " "); 68 currentPdOutlineItem = currentPdOutlineItem.getNextSibling(); 69 } 70 } 71 72 @Test 73 public void testPrintOutline() { 74 File file = new File(path, "R常用函数整理.pdf"); 75 if (!file.exists()) { 76 System.err.println(" file is not exists "); 77 return; 78 } 79 try (FileInputStream fis = new FileInputStream(file)) { 80 PDFParser parser = new PDFParser(new RandomAccessReadBuffer(fis)); 81 try (PDDocument document = parser.parse()) { 82 PdfOutlineTest pdfOutlineTest = new PdfOutlineTest(); 83 PDDocumentOutline pdDocumentOutline = document.getDocumentCatalog().getDocumentOutline(); 84 if (pdDocumentOutline != null) { 85 pdfOutlineTest.printOutline(pdDocumentOutline, ""); 86 } else { 87 System.out.println("This document does not contain any outline"); 88 } 89 } 90 } catch (IOException ex) { 91 System.err.println("IOException"); 92 } 93 } 94 95 @Test 96 public void testAlterOutline() { 97 File file = new File(path, "R常用函数整理.pdf"); 98 if (!file.exists()) { 99 System.err.println(" file is not exists "); 100 return; 101 } 102 try (FileInputStream fis = new FileInputStream(file)) { 103 PDFParser parser = new PDFParser(new RandomAccessReadBuffer(fis)); 104 try (PDDocument document = parser.parse()) { 105 PdfOutlineTest pdfOutlineTest = new PdfOutlineTest(); 106 PDDocumentOutline pdDocumentOutline = document.getDocumentCatalog().getDocumentOutline(); 107 if (pdDocumentOutline != null) { 108 pdfOutlineTest.alterOutline(pdDocumentOutline, ""); 109 } else { 110 System.out.println("This document does not contain any outline"); 111 } 112 document.save(new File(path, "R常用函数整理_altered.pdf")); 113 } 114 } catch (IOException ex) { 115 System.err.println("IOException"); 116 } 117 } 118 }